《Head First 设计模式》之单件模式
单件模式(Singleton)
——确保一个类只有一个实例,并提供全局访问点。
有一些对象其实我们只需要一个,比如线程池、缓存、对话框、处理偏好设置和注册表的对象、日志对象。如果制造出多个实例,就会导致程序的行为异常、资源使用过量,或者不一致的结果等。
- 要点
- 在Java中实现单件模式需要私有的构造器、一个静态方法和一个静态变量。
- 多线程问题。
1 public class Singleton{ 2 private static Singleton uniqueInstance;//用一个静态变量记录Singleton类的唯一实例 3 4 private Singleton(){}//构造器声明为私有的,只有Singleton类内才能调用 5 6 public static Singleton getInstance(){//若我们不需要这个实例,它就永远不会产生。这就是“延迟实例化”(lazy instantiaze) 7 if(uniqueInstance == null){ 8 uniqueInstance = new Singleton(); 9 } 10 return uniqueInstance; 11 } 12 }
处理多线程:
- 同步getInstance()方法
1 //每个线程在进入这个方法之前,要先等候别的线程离开该方法。 2 public static synchronized Singleton getInstance(){ 3 if(uniqueInstance == null){ 4 uniqueInstance = new Singleton(); 5 } 6 return uniqueInstance; 7 }
- 急切实例化
1 public class Singleton{ 2 //在静态初始化器(static initializer)中创建单件。保证了线程安全(thread safe)。 3 private static Singleton uniqueInstance = new Singleton(); 4 5 private Singleton(){} 6 7 public static Singleton getInstance(){ 8 return uniqueInstance; 9 } 10 }//JVM保证在任何线程访问uniqueInstance静态变量之前,一定先创建此实例。
- 双重检查加锁(double-checked locking)